home *** CD-ROM | disk | FTP | other *** search
- package java.text;
-
- import java.awt.font.NumericShaper;
- import java.awt.font.TextAttribute;
- import java.security.AccessController;
- import sun.security.action.LoadLibraryAction;
- import sun.text.CodePointIterator;
-
- public final class Bidi {
- byte dir;
- byte baselevel;
- int length;
- int[] runs;
- int[] cws;
- public static final int DIRECTION_LEFT_TO_RIGHT = 0;
- public static final int DIRECTION_RIGHT_TO_LEFT = 1;
- public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2;
- public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1;
- private static final int DIR_MIXED = 2;
- private static final char NUMLEVELS = '>';
- private static final int RMASK = 57378;
-
- public Bidi(String var1, int var2) {
- if (var1 == null) {
- throw new IllegalArgumentException("paragraph is null");
- } else {
- nativeBidiChars(this, var1.toCharArray(), 0, (byte[])null, 0, var1.length(), var2);
- }
- }
-
- public Bidi(AttributedCharacterIterator var1) {
- if (var1 == null) {
- throw new IllegalArgumentException("paragraph is null");
- } else {
- byte var2 = -2;
- byte[] var3 = null;
- int var4 = var1.getBeginIndex();
- int var5 = var1.getEndIndex();
- int var6 = var5 - var4;
- int var7 = 0;
- char[] var8 = new char[var6];
-
- for(char var9 = var1.first(); var9 != '\uffff'; var9 = var1.next()) {
- var8[var7++] = var9;
- }
-
- var1.first();
-
- try {
- Boolean var18 = (Boolean)var1.getAttribute(TextAttribute.RUN_DIRECTION);
- if (var18 != null) {
- if (TextAttribute.RUN_DIRECTION_LTR.equals(var18)) {
- var2 = 0;
- } else {
- var2 = 1;
- }
- }
- } catch (ClassCastException var16) {
- }
-
- try {
- NumericShaper var19 = (NumericShaper)var1.getAttribute(TextAttribute.NUMERIC_SHAPING);
- if (var19 != null) {
- var19.shape(var8, 0, var8.length);
- }
- } catch (ClassCastException var15) {
- }
-
- int var20 = var4;
-
- int var11;
- do {
- var1.setIndex(var20);
- Object var10 = var1.getAttribute(TextAttribute.BIDI_EMBEDDING);
- var11 = var1.getRunLimit(TextAttribute.BIDI_EMBEDDING);
- if (var10 != null) {
- try {
- int var12 = (Integer)var10;
- if (var12 >= -61 && var12 < 61) {
- byte var13 = (byte)(var12 < 0 ? -var12 | 128 : var12);
- if (var3 == null) {
- var3 = new byte[var6];
- }
-
- for(int var14 = var20 - var4; var14 < var11 - var4; ++var14) {
- var3[var14] = var13;
- }
- }
- } catch (ClassCastException var17) {
- }
- }
-
- var20 = var11;
- } while(var11 < var5);
-
- nativeBidiChars(this, var8, 0, var3, 0, var8.length, var2);
- }
- }
-
- public Bidi(char[] var1, int var2, byte[] var3, int var4, int var5, int var6) {
- if (var1 == null) {
- throw new IllegalArgumentException("text is null");
- } else if (var5 < 0) {
- throw new IllegalArgumentException("bad length: " + var5);
- } else if (var2 >= 0 && var5 <= var1.length - var2) {
- if (var3 == null || var4 >= 0 && var5 <= var3.length - var4) {
- if (var3 != null) {
- int var7 = var4;
-
- for(int var8 = var4 + var5; var7 < var8; ++var7) {
- if (var3[var7] < 0) {
- byte[] var9 = new byte[var5];
- System.arraycopy(var3, var4, var9, 0, var5);
-
- for(int var10 = var7 - var4; var10 < var5; ++var10) {
- if (var9[var10] < 0) {
- var9[var10] = (byte)(-var9[var10] | 128);
- }
- }
-
- var3 = var9;
- var4 = 0;
- break;
- }
- }
- }
-
- nativeBidiChars(this, var1, var2, var3, var4, var5, var6);
- } else {
- throw new IllegalArgumentException("bad range: " + var4 + " length: " + var5 + " for embeddings of length: " + var1.length);
- }
- } else {
- throw new IllegalArgumentException("bad range: " + var2 + " length: " + var5 + " for text of length: " + var1.length);
- }
- }
-
- private Bidi(int var1, int var2, int var3, int[] var4, int[] var5) {
- this.reset(var1, var2, var3, var4, var5);
- }
-
- private void reset(int var1, int var2, int var3, int[] var4, int[] var5) {
- this.dir = (byte)var1;
- this.baselevel = (byte)var2;
- this.length = var3;
- this.runs = var4;
- this.cws = var5;
- }
-
- public Bidi createLineBidi(int var1, int var2) {
- if (var1 == 0 && var2 == this.length) {
- return this;
- } else {
- int var3 = var2 - var1;
- if (var1 >= 0 && var2 >= var1 && var2 <= this.length) {
- if (this.runs == null) {
- return new Bidi(this.dir, this.baselevel, var3, (int[])null, (int[])null);
- } else {
- int var4 = -1;
- int[] var5 = null;
- if (this.cws != null) {
- int var6 = 0;
-
- for(int var7 = this.cws.length; var6 < var7; ++var6) {
- if (this.cws[var6] >= var1) {
- for(var7 = var6; var7 < this.cws.length && this.cws[var7] < var2; ++var7) {
- }
-
- for(int var8 = var2 - 1; var7 > var6 && this.cws[var7 - 1] == var8; --var8) {
- var4 = var8;
- --var7;
- }
-
- if (var4 == var1) {
- return new Bidi(this.dir, this.baselevel, var3, (int[])null, (int[])null);
- }
-
- int var9 = var7 - var6;
- if (var9 > 0) {
- var5 = new int[var9];
-
- for(int var10 = 0; var10 < var9; ++var10) {
- var5[var10] = this.cws[var6 + var10] - var1;
- }
- }
- break;
- }
- }
- }
-
- int[] var14 = null;
- byte var16 = this.baselevel;
- int var17 = var4 == -1 ? var2 : var4;
- int var18 = 0;
- int var19 = this.runs.length;
-
- int var11;
- for(var11 = this.dir; var18 < this.runs.length; var18 += 2) {
- if (this.runs[var18] > var1) {
- for(var19 = var18; var19 < this.runs.length && this.runs[var19] < var17; var19 += 2) {
- }
-
- if (var19 <= var18 && this.runs[var18 + 1] == this.baselevel) {
- var11 = (this.runs[var18 + 1] & 1) == 0 ? 0 : 1;
- } else {
- var19 += 2;
- if (var4 != -1 && var19 > var18 && this.runs[var19 - 1] != this.baselevel) {
- var14 = new int[var19 - var18 + 2];
- var14[var19 - var18] = var3;
- var14[var19 - var18 + 1] = this.baselevel;
- } else {
- var17 = var2;
- var14 = new int[var19 - var18];
- }
-
- int var12 = 0;
-
- for(int var13 = var18; var13 < var19; var13 += 2) {
- var14[var12++] = this.runs[var13] - var1;
- var14[var12++] = this.runs[var13 + 1];
- }
-
- var14[var12 - 2] = var17 - var1;
- }
- break;
- }
- }
-
- return new Bidi(var11, this.baselevel, var3, var14, var5);
- }
- } else {
- throw new IllegalArgumentException("range " + var1 + " to " + var2 + " is invalid for paragraph of length " + this.length);
- }
- }
- }
-
- public boolean isMixed() {
- return this.dir == 2;
- }
-
- public boolean isLeftToRight() {
- return this.dir == 0;
- }
-
- public boolean isRightToLeft() {
- return this.dir == 1;
- }
-
- public int getLength() {
- return this.length;
- }
-
- public boolean baseIsLeftToRight() {
- return (this.baselevel & 1) == 0;
- }
-
- public int getBaseLevel() {
- return this.baselevel;
- }
-
- public int getLevelAt(int var1) {
- if (this.runs != null && var1 >= 0 && var1 < this.length) {
- int var2;
- for(var2 = 0; var1 >= this.runs[var2]; var2 += 2) {
- }
-
- return this.runs[var2 + 1];
- } else {
- return this.baselevel;
- }
- }
-
- public int getRunCount() {
- return this.runs == null ? 1 : this.runs.length / 2;
- }
-
- public int getRunLevel(int var1) {
- return this.runs == null ? this.baselevel : this.runs[var1 * 2 + 1];
- }
-
- public int getRunStart(int var1) {
- return this.runs != null && var1 != 0 ? this.runs[var1 * 2 - 2] : 0;
- }
-
- public int getRunLimit(int var1) {
- return this.runs == null ? this.length : this.runs[var1 * 2];
- }
-
- public static boolean requiresBidi(char[] var0, int var1, int var2) {
- CodePointIterator var3 = CodePointIterator.create(var0, var1, var2);
-
- for(int var4 = var3.next(); var4 != -1; var4 = var3.next()) {
- if (var4 > 1424) {
- int var5 = nativeGetDirectionCode(var4);
- if (('\ue022' & 1 << var5) != 0) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public static void reorderVisually(byte[] var0, int var1, Object[] var2, int var3, int var4) {
- if (var4 < 0) {
- throw new IllegalArgumentException("count " + var4 + " must be >= 0");
- } else if (var1 >= 0 && var1 + var4 <= var0.length) {
- if (var3 >= 0 && var3 + var4 <= var2.length) {
- byte var5 = 63;
- byte var6 = 0;
- int var7 = var1 + var4;
-
- for(int var8 = var1; var8 < var7; ++var8) {
- byte var9 = var0[var8];
- if (var9 > var6) {
- var6 = var9;
- }
-
- if ((var9 & 1) != 0 && var9 < var5) {
- var5 = var9;
- }
- }
-
- label68:
- for(int var13 = var3 - var1; var6 >= var5; --var6) {
- int var14 = var1;
-
- while(true) {
- while(var14 >= var7 || var0[var14] >= var6) {
- int var10 = var14++;
- if (var10 == var7) {
- continue label68;
- }
-
- while(var14 < var7 && var0[var14] >= var6) {
- ++var14;
- }
-
- int var11 = var14 - 1;
- var10 += var13;
-
- for(int var16 = var11 + var13; var10 < var16; --var16) {
- Object var12 = var2[var10];
- var2[var10] = var2[var16];
- var2[var16] = var12;
- ++var10;
- }
- }
-
- ++var14;
- }
- }
-
- } else {
- throw new IllegalArgumentException("objectStart " + var3 + " and count " + var4 + " out of range [0, " + var2.length + "]");
- }
- } else {
- throw new IllegalArgumentException("levelStart " + var1 + " and count " + var4 + " out of range [0, " + var0.length + "]");
- }
- }
-
- private static native int nativeGetDirectionCode(int var0);
-
- private static synchronized native void nativeBidiChars(Bidi var0, char[] var1, int var2, byte[] var3, int var4, int var5, int var6);
-
- public String toString() {
- StringBuffer var1 = new StringBuffer(super.toString());
- var1.append("[dir: " + this.dir);
- var1.append(" baselevel: " + this.baselevel);
- var1.append(" length: " + this.length);
- if (this.runs == null) {
- var1.append(" runs: null");
- } else {
- var1.append(" runs: [");
-
- for(int var2 = 0; var2 < this.runs.length; var2 += 2) {
- if (var2 != 0) {
- var1.append(' ');
- }
-
- var1.append(this.runs[var2]);
- var1.append('/');
- var1.append(this.runs[var2 + 1]);
- }
-
- var1.append(']');
- }
-
- if (this.cws == null) {
- var1.append(" cws: null");
- } else {
- var1.append(" cws: [");
-
- for(int var3 = 0; var3 < this.cws.length; ++var3) {
- if (var3 != 0) {
- var1.append(' ');
- }
-
- var1.append(Integer.toHexString(this.cws[var3]));
- }
-
- var1.append(']');
- }
-
- var1.append(']');
- return var1.toString();
- }
-
- static {
- AccessController.doPrivileged(new LoadLibraryAction("awt"));
- AccessController.doPrivileged(new LoadLibraryAction("fontmanager"));
- }
- }
-